/*
 * Copyright 2004-2005 asoft
 * 本软件及其所有拷贝的名称，与光盘上或本软件中注明的公司同在。
 * 本软件及文档享有版权，并受国家版权法及国际协约条款的保护。
 * 您不可以从本软件中去掉其版权声明；并保证为本软件的拷贝（本部或部分）* 复制版权声明。
 * 您同意制止以任何形式非法拷贝本软件及文档。
 * 版权信息参见：
 *      http://www.asoft.cn/licenses
 */

package com.asoft.common.base.model;

import java.io.Serializable;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.apache.log4j.Logger;

import com.asoft.common.sysframe.model.Org;
import com.asoft.common.sysframe.model.User;

/**
 * Base class for Model objects.  Child objects should implement toString(),
 * equals() and hashCode();
 *
 * <p>
 * <a href="BaseObject.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 */
public abstract class BaseObject implements Serializable
{
        static Logger logger = Logger.getLogger(BaseObject.class);

        protected String id;
        
        protected String code;
        
        /** 优先级 */
        protected String pri;

        /** 创建人 */
        protected User creator;

        /** 创建时间 */
        protected Timestamp createTime;

        /** 创建部门 */
        protected Org createOrg;

        /** 最后一次修改人 */
        protected User lastUpdator;

        /** 最后一次修改时间 */
        protected Timestamp lastUpdateTime;

        /** 最后一次修改部门 */
        protected Org lastUpdateOrg;

         /** 横表：上一个bo */
        private BaseObject preBO;

        /** 横表：下一个bo */
        private BaseObject nextBO;

        /** 描述model的xml */
        private StringBuffer xml;
        
        protected BaseObject parent;
        
        protected Set sons;

        public Serializable getIdentity()
        {
                return this.id;
        }

        public String getId()
        {
                return id;
        }

        public void setId(String id)
        {
                this.id = id;
        }

        /**
         * @return 返回 code。
         */
        public String getCode()
        {
                return code;
        }

        /**
         * @param code 要设置的 code。
         */
        public void setCode(String code)
        {
                this.code = code;
        }

        /**
         * 日期格式化器
         */
        public String formatDate(Date date,String par)
        {
                SimpleDateFormat sform = new SimpleDateFormat(par);
                return sform.format(date);
        }

        public String formatDouble(double d,String par)
        {
                DecimalFormat df=new DecimalFormat(par);
                return df.format(d);
        }

        /** Model的详细信息 */
        public void setModelFieldDetail(String key,String value)
        {
                this.xml.append("<field id='");
                this.xml.append(key);
                this.xml.append("'><![CDATA[");
                this.xml.append(value);
                this.xml.append("]]></field>");
        }
        
        /** Model的详细信息 */
        public void setModelFieldDetail(String key,int value)
        {
                this.setModelFieldDetail(key,Integer.toString(value));
        }
        
        /** Model的详细信息 */
        public void setModelFieldDetail(String key,long value)
        {
                this.setModelFieldDetail(key,Long.toString(value));
        }

        public String getModelDetailXML()
        {
                this.xml = new StringBuffer(1000);
                this.xml.append("<model>");
                this.setModeldetail();
                this.xml.append("</model>");
                return this.xml.toString();
        }

        public void setModeldetail()
        {
                throw new RuntimeException("方法public void setModeldetail() 未实现");
        }

        /**
         * @return 返回 createOrg。
         */
        public Org getCreateOrg()
        {
                return createOrg;
        }



        /**
         * @param createOrg 要设置的 createOrg。
         */
        public void setCreateOrg(Org createOrg)
        {
                this.createOrg = createOrg;
        }

        /**
         * @return 返回 createTime。
         */
        public Timestamp getCreateTime()
        {
                return createTime;
        }

        /**
         * @param createTime 要设置的 createTime。
         */
        public void setCreateTime(Timestamp createTime)
        {
                this.createTime = createTime;
        }

        /**
         * @return 返回 creator。
         */
        public User getCreator()
        {
                return creator;
        }

        /**
         * @param creator 要设置的 creator。
         */
        public void setCreator(User creator)
        {
                this.creator = creator;
        }

        /**
         * @return 返回 lastUpdateOrg。
         */
        public Org getLastUpdateOrg()
        {
                return lastUpdateOrg;
        }

        /**
         * @param lastUpdateOrg 要设置的 lastUpdateOrg。
         */
        public void setLastUpdateOrg(Org lastUpdateOrg)
        {
                this.lastUpdateOrg = lastUpdateOrg;
        }

        /**
         * @return 返回 lastUpdateTime。
         */
        public Timestamp getLastUpdateTime()
        {
                return lastUpdateTime;
        }

        /**
         * @param lastUpdateTime 要设置的 lastUpdateTime。
         */
        public void setLastUpdateTime(Timestamp lastUpdateTime)
        {
                this.lastUpdateTime = lastUpdateTime;
        }

        /**
         * @return 返回 lastUpdator。
         */
        public User getLastUpdator()
        {
                return lastUpdator;
        }

        /**
         * @param lastUpdator 要设置的 lastUpdator。
         */
        public void setLastUpdator(User lastUpdator)
        {
                this.lastUpdator = lastUpdator;
        }

        /**
         * @return 返回 nextBO。
         */
        public BaseObject getNextBO()
        {
                return nextBO;
        }

        /**
         * @param nextBO 要设置的 nextBO。
         */
        public void setNextBO(BaseObject nextBO)
        {
                this.nextBO = nextBO;
        }

        /**
         * @return 返回 preBO。
         */
        public BaseObject getPreBO()
        {
                return preBO;
        }

        /**
         * @param preBO 要设置的 preBO。
         */
        public void setPreBO(BaseObject preBO)
        {
                this.preBO = preBO;
        }

        /**
         * @return 返回 pri。
         */
        public String getPri()
        {
                return pri;
        }

        /**
         * @param pri 要设置的 pri。
         */
        public void setPri(String pri)
        {
                this.pri = pri;
        }

        /**
         * @return 返回 xml。
         */
        public StringBuffer getXml()
        {
                return xml;
        }

        /**
         * @param xml 要设置的 xml。
         */
        public void setXml(StringBuffer xml)
        {
                this.xml = xml;
        }
        
        /**
         * @return 返回 parent。
         */
        public BaseObject getParent()
        {
                return parent;
        }

        /**
         * @param parent 要设置的 parent。
         */
        public void setParent(BaseObject parent)
        {
                this.parent = parent;
        }

        /** 采用id匹配(会影响到hibernate批量新增)还是全部属性值匹配(编码麻烦) */
        public boolean equals(Object object)
        {
                if (!(object instanceof BaseObject))
                {
                        return false;
                }
                BaseObject bo = (BaseObject) object;
                if(this.getId() != bo.getId()
                && this.getCode() != bo.getCode()
                && this.getPri() != bo.getPri())
                {
                        return ( this.getId() != null 
                               & this.getCode() != null
                               & this.getPri() != null
                               & this.getId().equals(bo.getId())
                               & this.getCode().equals(bo.getCode())
                               &(this.getPri().equals(bo.getPri()))
                               );
                }
                else
                {
                        return true;
                }
        }

        public int hashCode()
        {
                return ("BaseObject" + this.getId() + "_" + this.getCode() + "_" + this.getPri()).hashCode();
        }
        
        // 添加儿子节点
        public void addSon(BaseObject bo)
        {
                if(this.sons == null)
                {
                        this.sons = new LinkedHashSet();
                }
                this.sons.add(bo);
        }

        /** 获取所有子孙节点 */
        public List getChildren()
        {
                return this.getChildren(this);

        }
        /** 递归获取子孙节点model */
        private List getChildren(BaseObject parent)
        {
                List tsons = new ArrayList(parent.getSons());
                List children = new Vector();
                children.addAll(tsons);
                if(tsons.size() != 0)
                {

                        for(int i = 0; i <tsons.size(); i ++)
                        {
                                BaseObject bo = (BaseObject)tsons.get(i);
                                children.addAll(this.getChildren(bo));
                        }
                }
                return children;
        }
        
        // 取得儿子by code
        public BaseObject getSonByCode(String code)
        {
                if(this.sons != null)
                {
                        Object[] sonObjs = this.sons.toArray();
                        for(int i = 0; i < sonObjs.length; i ++)
                        {
                                BaseObject bo = (BaseObject)sonObjs[i];
                                if(bo.getCode().equals(code))
                                {
                                        return bo;
                                }
                        }
                }
                return null;
        }
        
        // 取得子孙　by code
        public BaseObject getChildByCode(String code)
        {
                List children = this.getChildren();
                for(int i = 0; i < children.size(); i ++)
                {
                        BaseObject bo = (BaseObject)children.get(i);
                        if(bo.getCode().equals(code))
                        {
                                return bo;
                        }
                }
                return null;
        }

        /**
         * @return 返回 sons。
         */
        public Set getSons()
        {
                return sons;
        }

        /**
         * @param sons 要设置的 sons。
         */
        public void setSons(Set sons)
        {
                this.sons = sons;
        }
}
